package LearnAlgorithm.g_数学问题;

import java.util.Scanner;

/*
两只青蛙在网上相识了，它们聊得很开心，于是觉得很有必要见面。
它们很高兴地发现它们住在同1条纬度线上，于是它们约定各自朝西跳，直到碰面为止。
可是它们出发之前忘记了一件很重要的事情，既没有问清楚对方的特征，也没有约定见面的具体位置。
不过青蛙们都是很乐观的，它们觉得只要一直朝着某个方向跳下去，总能碰到对方的。
但是除非这两只青蛙在同一时间跳到同一点上，不然是永远都不可能碰面的。
为了帮助这两只乐观的青蛙，你被要求写一个程序来判断这两只青蛙是否能够碰面，会在什么时候碰面。

我们把这两只青蛙分别叫做青蛙A和青蛙B，
并且规定纬度线上东经0度处为原点，
由东往西为正方向，
单位长度1米，
这样我们就得到了1条首尾相接的数轴。

设青蛙A的出发点坐标是x，青蛙B的出发点坐标是y。
青蛙A能一次跳m米，青蛙B能一次跳n米， 两只青蛙跳一次所花费的时间相同。
纬度线总长L米。
现在要你求出它们跳了几次以后才会碰面。




输入只包括1行5个整数x， y, m, n, L,
其中
	x ≠ y < 20000000000
	0 < m < 20000000000
	0 < n < 20000000000
	0 < L < 21000000000




(x + km) ≡ (y + kn) (mod L)		一共跳了k次
(x + km) = L * 倍数1 + 余数
(y + kn) = L * 倍数2 + 余数		两个余数相同
化简得
(m - n) * k + L * (倍数1 - 倍数2) = y - x
设	倍数1 - 倍数2 = t
(m - n) * k + L * t = y - x
这不就是
ax + by = m这种裴蜀等式么！
 */
public class f青蛙的约会 {
	private static double X = 0D;
	private static double Y = 0D;
	
	public static void main(String[] args) {
		new f青蛙的约会().deal();
	}
	
	public void deal() {
		Scanner scanner = new Scanner(System.in);
		System.out.println("A的起始位置：");
		double x = scanner.nextDouble();
		System.out.println("B的起始位置：");
		double y = scanner.nextDouble();
		System.out.println("A的跳跃距离：");
		double m = scanner.nextDouble();
		System.out.println("B的跳跃距离：");
		double n = scanner.nextDouble();
		System.out.println("数轴长度：");
		double L = scanner.nextDouble();
		
		try {
			//(m - n) * k + L * t = y - x
			//a = m - n
			//b = L
			//m = y - x
			double d = useGcdExt(m - n, L, y - x);
			double singleForb = Math.abs(L / d);//因为b / d不一定是正数
			double x0 = X;
			x0 = ((x0 % singleForb) + singleForb) % singleForb;//求第一个正数解；两次取余是有原因的，自己去画图或者去看    d一步之遥other第一个大于0的x
			System.out.println("需要跳：" + x0);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("无解！");
		}
	}
	
	public double useGcdExt(double a, double b, double m) throws Exception {
		double d = gcd_ext(a, b);
		if (m % d != 0) {
			throw new Exception("无解！");
		}
		X *= m / d;
		Y *= m / d;
		return d;
	}
	
	public double gcd_ext(double a, double b) {
		if (b == 0D) {
			X = 1D;
			Y = 0D;
			return a;
		}
		double res = gcd_ext(b, a % b);
		double x1 = X;
		X = Y;
		Y = x1 - ((int) (a / b) * Y);
		return res;
	}
	
	//以后遇到这种问题直接默写下面的静态内部类
	private static class ExtGcd {
		static long x;
		static long y;
		public static long ext_gcd(long a, long b) {
			if(b == 0){
				x = 1;
				y = 0;
				return a;
			}
			long res = ext_gcd(b, a % b);
			long x1 = x;
			x = y;
			y = x1 - a / b * y;
			return res;
		}
		
		public static long linearEquation(long a, long b, long m) throws Exception {
			long d = ext_gcd(a, b);
			if (m % d != 0) {
				throw new Exception("无解");
			}
			long n = Math.abs(m / d);
			x *= n;
			y *= n;
			return d;
		}
	}
}
